#include和studio.h能不能比喻直白一点这个是什么意思?

您所在的位置:网站首页 course include什么意思 #include和studio.h能不能比喻直白一点这个是什么意思?

#include和studio.h能不能比喻直白一点这个是什么意思?

2023-03-23 07:15| 来源: 网络整理| 查看: 265

这虽然是一个很“初级”的问题,但是背后的东西还是有点的。 c++还要复杂点,这里就谈纯c。

c编译阶段可以简单分为预处理,编译,汇编,链接。你的问题牵涉到其中的 预处理和链接2个阶段。

#include 就是将后面的文件合并到当前文件。在预处理阶段,编译器会把对应文件内容复制到源码里面,也就是说和你把stdio.h 里面内容复制粘贴到当前c文件里面效果是一样的。

stdio.h就是c标准库的头文件,包含一系列定义声明,但是不包含函数实现。c的编译和链接是2个阶段,编译期通过.h中的找到函数声明,链接时候将函数的指针设置为正确的位置就完成了编译。

同样,可以打开系统的h文件,里面往往还有include,预处理阶段会展开合并。可以随手写一个简单的c helloworld ,

#include int main(int argc, char *argv[]) { printf("aaa\n"); return 0; }

gcc用-E 显示预处理结果。

gcc -E xx.c

可以看到编译之前,预处理之后的c文件。上面那一大堆代码就是include进来的代码。这就是include。目的就是在宏的帮助下正确进行代码合并。

.h文件就是头文件,作用很多,自己写的头文件一般是项目中公用的数据结构和声明等(当然h文件里面放函数体是完全允许的,这里不展开)。

库提供的h(比如stdio.h),是以源码形式提供的库提供的数据结构和函数声明。结合so/a/lib这样的二进制库发布使用。

举个栗子,printf函数

上面的例子,我们可以编译一下,gcc xxx.c -o test1

然后ldd test1

可以看到自动链接了 libc.so.6,ld-linux-x86-64.so.2等等,printf的二进制实现就在其中。

可以完全不include 任何文件就使用printf函数,你会发现虽然有警告,但是能正常工作。就是因为gcc默认链接了这些库。 同样的,我们可以在c文件里面#include

然后使用curses提供的一系列函数比如initscr();

编译一切正常,因为initscr这个函数定义可以在curses.h之中找到。但是链接失败,因为找不到函数的实现无法连接。gcc编译时候加上 -l curses 表示连接libncurses.so,这样就能正常编译和运行。

而initscr对应libncurses之中什么玩意儿,牵涉到c的符号体系,而c/c++标准没有定义二进制发布的符号,导致编译器自己实现,导致c的二进制发布无法跨平台甚至无法跨操作系统版本,这也是linux早期一直使用源码发布的根本原因之一。这里就不展开说了,有兴趣可以看一本书《深入理解计算机系统》

总结一下,include就是代码复制到当前文件。stdio.h这样的头文件,存放库提供的数据结构和函数声明,而函数的实现一般放在二进制库文件之中。正常编译除了有h文件以外,还需要查看对应文档了解链接方式。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3